17. 静态关键词
静态关键词
有时候,你需要在函数中一再重复使用同一个变量。回顾一下 Andy 的 Python 直方图滤波器代码,其中的 blur() 函数就是个很好的例子。
blur 函数包括几个模糊因子,每次调用函数时它们都是一样的;但是,在 Andy 的 C++ 代码中,他每次都会重新计算这些模糊因子,你下面可以看到。
要是无论调用多少次函数,这些变量只需要声明并定义一次,会怎么样呢?你可以消除大量的内存读写操作。这是 C++ 静态关键词的一个完美用例。
举例
当你在一个 C++ 函数内部声明并定义一个变量时,值会分配到内存中。
例如:
some_function() {
int x = 5;
}
这段代码先在内存中为变量 x 分配空间,然后为其赋值 5。接下来,函数完成时,CPU 会从 RAM 中删除变量 x。这意味着每次运行函数时,CPU 都需要为 x 变量分配内存,然后解除分配。
反过来,如果你的代码使用了静态关键词,那么 x 变量就会在函数第一次运行时分配到内存中。这样,x 变量在整个程序的持续期间,都会保留在内存中。这样,你就省去了一些 RAM 读取次数:
some_function() {
static int x = 5;
}
注意,你需要同时声明和定义变量。在使用静态关键词定义变量时,不给变量赋值是不可能的。
全局变量 vs 静态变量
实际上,在内存中,静态变量和全局变量放置的位置是相同的。不同之处在于,全局变量在函数外部声明,程序中的任何函数或文件都可以使用。反过来,静态变量是在函数内部的。因此,在上面的例子中,some_function() 是可以访问 x 变量的唯一位置。
练习
在本练习中,你会看到使用静态关键词时,代码运行速度能提高多少。你还可以删除一些 for 循环!
回顾一下 Python 直方图滤波器代码,其中的 blur() 函数是怎么用的。你使用了一个二维网格来表述机器人的世界。每个网格空间都有一个概率,表示机器人位于这个格子上的可能性。机器人利用传感器数据更新其位置信息/位置的概率值后,使用 blur 函数对概率值进行平滑处理。
在本练习中,你需要检查 Andy 的 blur 函数的一部分。具体而言,是计算 blur 窗口的那部分。你会删除一些 for 循环,并使用静态关键词让代码运行更快。